// 注：如果你的项目在其 package.json 文件中没有指定 "type":"module"，则 eslint.config.js 必须是 CommonJS 格式  详见官网：https://eslint.nodejs.cn/docs/latest/use/configure/configuration-files
import globals from 'globals';

import eslint_js from '@eslint/js'

//ts
import tsEslintParser from "@typescript-eslint/parser";
import tsEslintPlugin  from "@typescript-eslint/eslint-plugin";


//react
import eslintReactPlugin from "eslint-plugin-react";
import eslintPluginReactHooks  from 'eslint-plugin-react-hooks'
import eslintPluginImport from 'eslint-plugin-import';

//prettier
import eslintConfigPrettier from "eslint-config-prettier";
import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";

export default [

  // es  lint默认规则
  eslint_js.configs.recommended,
  // prettier 默认推荐规则
  eslintPluginPrettierRecommended,
      /**
 * prettier 配置
 * 会合并根目录下的prettier.config.js 文件
 * @see https://prettier.io/docs/en/options
 */
      eslintConfigPrettier,
  //ts默认规则
  {
    name: "typescript-eslint/base",
    languageOptions: {
      parser: tsEslintParser,
      sourceType: "module", // ECMAScript 模块
      ecmaVersion:'latest', //默认latest
    },
    files: ["src/**/*.{js,jsx,ts,tsx}"],
    rules: {
      ...tsEslintPlugin.configs.recommended.rules,
      '@typescript-eslint/no-empty-function': 'warn',
      '@typescript-eslint/no-var-requires': 'off',
      '@typescript-eslint/no-unused-vars': 'warn',
      '@typescript-eslint/no-shadow': 'off',
      '@typescript-eslint/no-explicit-any': 'warn',
      '@typescript-eslint/ban-ts-comment': 'warn', // @ts-ignore
      '@typescript-eslint/no-unused-expressions':'warn',
    },
    plugins: {
      // ts 语法特有的规则，例如泛型
      "@typescript-eslint": tsEslintPlugin
    }
  },
  //全局配置
  {
    name: "global config",
    languageOptions: {
      globals: {
        ...globals.es2022,
        ...globals.browser,
        ...globals.node
      },
      parserOptions: {
        warnOnUnsupportedTypeScriptVersion: false
      }
    },
    rules: {
      semi: ['error', 'never'],
      // 'prettier/prettier': 1, //  eslint-plugin-prettier 使用prettier作为eslint规则
      'prettier/prettier': [1, { singleQuote: true }],
      quotes: [2, 'single'],
      'no-console': ['error', { allow: ['warn', 'error'] }],
      'no-debugger':  'off',
      'prefer-destructuring': 0, //强制使用解构
      'func-names': 0, //可以强制或不允许使用命名的函数表达式
      'no-nested-ternary': 0, //不允许使用嵌套的三元表达式
      'no-unused-expressions': 0, // 消除那些对程序状态没有影响的未使用的表达式
      'no-param-reassign': 0, // 不允许给函数参数重新赋值
      'no-plusplus': 0, // 不允许使用单数运算符 ++ 和 -
      'no-continue': 0, // 禁用 continue 语句
      'prefer-promise-reject-errors': 0, //只拒绝带有 Error 对象的 Promise
      'no-else-return': 0, //当遇到在一连串的 if 后面有一个 else，而这些 if 都包含 return 语句时，它将发出警告
      // 'no-shadow': 1, // 该用ts规则 不允许声明变量名相同的变量
      'no-redeclare': 2, // 禁止重复声明变量
      'consistent-return': 0, //函数 return 时 不能return undefined ,必须return 一个明确的值
      'no-spaced-func': 0, // 函数调用时 函数名与()之间能否有空格
      'no-this-before-super': 0, // 在调用super()之前不能使用this或super
      'no-undef': 0, // 是否允许有未定义的变量
      'no-use-before-define': 0, // 未定义前不能使用
      'no-restricted-syntax': 0, //不允许指定的（也就是用户定义的）语法
      'guard-for-in': 0, //防止因使用 for in
      'no-empty-function': 'off',
      'no-unsafe-optional-chaining': 0, //禁止使用不安全的可选链
      'prefer-const': [
        'error',
        {
          destructuring: 'all',
          ignoreReadBeforeAssign: false
        }
      ],
      'no-constant-binary-expression':'off',
    },
    ignores: ['node_modules','bigScreen','commitlint.config.js','.prettierrc.js','vite.config.ts','prettier.config.js'],
  },
  //react配置
  {
    name: "react-eslint",
    files: ["src/**/*.{js,jsx,ts,tsx}"],
    plugins: {
      react: eslintReactPlugin,
      "react-hooks": eslintPluginReactHooks,
      "import":eslintPluginImport
    },
    languageOptions: {
      ...eslintReactPlugin.configs.recommended.languageOptions
      // parserOptions: {
      //   ecmaFeatures: {
      //     jsx: true, //使用哪些额外的语言特性
      //   },
      // },
    },
    rules: {
      ...eslintReactPlugin.configs.recommended.rules,
      ...eslintPluginReactHooks.configs.recommended.rules,
      ...eslintPluginImport.configs.recommended.rules,
      'react/jsx-props-no-spreading': 0, //禁止传递props
      'react/jsx-one-expression-per-line': 0, //每行需要一个 JSX 元素
      'react/jsx-curly-newline': 0, //在 JSX 属性和表达式的花括号中强制使用一致的换行符
      'react/forbid-prop-types': 0, //禁止某些 propTypes
      'react/jsx-indent': 0, //强制执行 JSX 缩进
      'react/jsx-uses-react': 0, // 不需要强制引入React
      'react/react-in-jsx-scope': 0, // 不需要强制引入React
      'react/jsx-wrap-multilines': [
        //禁止在多行 JSX 周围缺少括号
        'error',
        {
          declaration: false,
          assignment: false
        }
      ],
      'react/jsx-filename-extension': [
        //1:禁止可能包含 JSX 的文件扩展名
        0,
        {
          extensions: ['.js', '.jsx']
        }
      ],
      'react-hooks/rules-of-hooks': 1, // react hooks 只能用在 React component中或者 自定义hooks中
      'react/display-name': 'off', // 组件必须有displayName属性,如果是函数组件必须有名字
      'react/prop-types': 'off', //不允许在 React 组件定义中缺少 props 验证 使用ts进行类型校验,所以不用管prop-types
      'import/no-unresolved':'off'
    },
    settings: { //一个包含名称-值对信息的对象，所有规则都应使用这些信息。
      react: {
        // 需要显示安装 react
        version: "detect"
      }
    }
  },

]

